package com.company;

import java.lang.reflect.Constructor;

/*
获取构造方法：
        获取Public 修饰的：getConstructor()、getConstructors()
        获取不考虑权限修饰符：getDeclaredConstructor() 、 getDeclaredConstructors()
        以上方法中的参数是 类型.class，例如：getConstructor(String.class, int.class);

调用构造方法：
        反射获取到构造器之后
        调用 newInstance() 方法 创建对象
        newInstance() 空参构造器创建对象
        newInstance("zhangsan" ,"11") 有参构造器创建对象
 */
public class ReflectDemo03 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("com.company.Person");

        // ===================================== getConstructor() 获取 public 修饰的 构造方法，返回 Constructor 类型的对象 ==========================================
        // 如果构造方法重载之后，没有把默认构造方法手动写出，那么会报异常NoSuchMethodException
        // 如果 默认构造 和 有参构造 同时存在的话，该方法反射到的还是默认构造

        // 获取空参构造器
        Constructor ctr = cls.getConstructor();  // 总之最终返回的结果是 【必须是 public】 修饰的构造方法
        System.out.println(ctr);  // public com.company.Person()

        // 使用反射到的空参构造器创建对象
        Object person = ctr.newInstance(); // 这是空参构造器，所以不需要传参数
        System.out.println(person);  // name = null     age = 0





        // 获取有参构造器
        Constructor ctr1 = cls.getConstructor(String.class, int.class);  // 总之最终返回的结果是 【必须是 public】 修饰的构造方法
        System.out.println(ctr1);  // public com.company.Person(java.lang.String,int)
        // 使用反射到的有参构造器创建对象
        Object person1 = ctr1.newInstance("张三", 14);  // 反射构造方法的调用
        System.out.println(person1);  //  name = 张三     age = 14





//        System.out.println("分割线 ================================= 分割线 ========================================分割线");





        // ===================================== getConstructors() 获取 public 修饰的默认的 构造方法们，返回 Constructor 类型的 数组对象 ==========================================

//        Constructor[] ctrarr = cls.getConstructors();  // 总之最终返回的结果是 【必须是 public】 修饰的构造方法们
//        for (Constructor ctr1 : ctrarr
//             ) {
//            System.out.println(ctr1);
            /*
            public com.company.Person()
            public com.company.Person(java.lang.String,int)
             */

//        }

        // =============== getDeclaredConstructor() 获取 【默认的】 构造方法【不考虑权限修饰符】，返回 Constructor 类型的 对象 ============

        Constructor ctr2 = cls.getDeclaredConstructor(String.class,int.class);
        System.out.println(ctr2);

        // =============== getDeclaredConstructors() 获取 所有的 构造方法们【不考虑权限修饰符】，返回 Constructor 类型的 数组对象 ============

        Constructor[] ctr3arr = cls.getDeclaredConstructors();
        for( Constructor ctr3: ctr3arr){

            System.out.println(ctr3);

        }
    }
}
